﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using ttt.frontend;
using ttt.kontrakte;
using ttt.prozesse;
using ttt.regelwerk;

namespace ttt.app
{
    internal class FeatureBinder
    {
        private Action _run;


        public FeatureBinder(Dictionary<string, object> repo, WinSpielbrett frontend,
                             INeues_Spiel_beginnen featureNeuesSpiel,
                             ISpieler_zieht featureSpielerZieht)
        {
            Bind_Neues_Spiel_beginnen(repo, frontend, featureNeuesSpiel);
            Bind_Spieler_zieht(repo, frontend, featureSpielerZieht);
        }


        private void Bind_Neues_Spiel_beginnen(Dictionary<string, object> repo, WinSpielbrett frontend, INeues_Spiel_beginnen feature)
        {
            _run += () =>
                        {
                            feature.In_Process();
                            Application.Run(frontend);
                        };
            feature.Out_NeuesSpiel += frontend.In_GeänderterSpielstand;

            frontend.Out_Neues_Spiel += feature.In_Process;
        }


        private void Bind_Spieler_zieht(Dictionary<string, object> repo, WinSpielbrett frontend, ISpieler_zieht feature)
        {
            frontend.Out_Spieler_zieht += feature.In_Process;
            feature.Out_NeuerSpielstand += frontend.In_GeänderterSpielstand;
            feature.Out_UngültigerZug += frontend.In_UngültigerZug;
        }


        public void Run(string[] args)
        {
            _run();
        }
    }
}